package jp.co.oec_ltd.Memo_Apl;

import java.io.BufferedReader;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

import jp.co.oec_ltd.db.DatabaseHelper;

import jp.co.oec_ltd.ini.KeyBoard;
import jp.co.oec_ltd.ini.Node;
import jp.co.oec_ltd.ini.NodeList;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.DialogInterface.OnCancelListener;
import android.content.DialogInterface.OnClickListener;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.os.Environment;
import android.text.Editable;
import android.text.InputFilter;
import android.text.InputType;
import android.text.SpannableString;
import android.text.Spanned;
import android.text.TextWatcher;
import android.text.style.UnderlineSpan;
import android.util.Log;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.view.inputmethod.InputConnection;
import android.widget.Button;
import android.widget.EditText;
import android.widget.FrameLayout;
import android.widget.TextView;
import android.widget.TextView.OnEditorActionListener;
import android.widget.Toast;

//　マウスジェスチャーでundo　redoができるようにする？
//　http://y-anz-m.blogspot.com/2010/10/androidfilter.html
//　http://andante.in/i/コンポーネント/edittextクラスを使用する。/
//　http://groups.google.com/group/android-group-japan/browse_thread/thread/1673e249e03a44d2?pli=1

public class Memo_Apl extends Activity implements OnEditorActionListener {
    private static final int MENU_ID_MENU1 = (Menu.FIRST + 1);
    private static final int MENU_ID_MENU2 = (Menu.FIRST + 2);
    private static final int MENU_ID_MENU3 = (Menu.FIRST + 3);
    private static final int MENU_ID_MENU4 = (Menu.FIRST + 4);
//    MessageDialog    mMsgDialog           = new MessageDialog();
    /** アプリケーションコンテキスト */
    private Context           mContext;
    private boolean visible = true;
    /** レイアウト */
//    private ViewGroup    mLayoutMenu;
    /** メニューレイアウトの表示フラグ */
    private boolean      mVisibleFlg = true;
    /** メモエディット */
    private EditText     mMemoEdit;
    /** メモエディット */
    private Button       mUndoButton;
    private Button       mRedoButton;
//    private Button       mEndButton;
    private String       fileName    = "memofiles";
//    private Button       mSaveButton;
//    private Button       mOpenButton;
//    private TextView     mTestText;
    private TextView     mTitleText;
    // private NodeList node = new NodeList();
    private StationList  list    ;
    private String       afterStr    = "";
    private String       beforeStr   = "";
    private String       changeStr   = "";

    private StringBuffer str         = new StringBuffer();
    private String       strbase     = "";
    private int          keyEvent    = 0;
    private int          flg1        = 0;

    private String       mNewName    = "";
    private String       destStr1    = "";
    private String       destStr2    = "";
    private String       afterStr1   = "";
    private String       afterStr2   = "";
    private int          flgDest     = 0;
    private int          flgAfter    = 0;
    private int          flgNow      = 0;
    // エディットテキスト
    private EditText          mEditText;

    //フォルダ名固定
    String mSdDirectory="test01";

    //フォルダ名固定
    int  mFileCheckflg=3;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.baseform);
        initializeComponent();
        // mMemoEdit.addTextChangedListener(watchHandler);
        // mMemoEdit.setOnEditorActionListener(this);

        mMemoEdit.addTextChangedListener(watchHandler);
        mMemoEdit.setFilters(filters);
//        mMemoEdit.setFilters(filters);
//        onUndo();
//        KeyBoard kb =new KeyBoard();
//        kb.setComposingText
//        InputConnection ic = kb.getStr();
//        InputConnection a=new InputConnection();
        selectFile(mSdDirectory);
    }

    /**
     * 初期化処理
     */
    private void initializeComponent() {
        mContext = getApplicationContext();
//        mEditText = new EditText(mContext);
//        mEditText.setInputType(InputType.TYPE_CLASS_TEXT);
        list        = new StationList();
        list.insert("", 0);
//        mLayoutMenu = (ViewGroup) findViewById(R.id.menu_linearlayout);
//        mLayoutMenu.setVisibility(View.GONE);
        mMemoEdit = (EditText) findViewById(R.id.memo_editText);
        mUndoButton = (Button) findViewById(R.id.undo_button);
        mRedoButton = (Button) findViewById(R.id.redo_button);
//        mEndButton = (Button) findViewById(R.id.end_button);
//        mSaveButton = (Button) findViewById(R.id.saveas_button);
//        mOpenButton = (Button) findViewById(R.id.open_button);
//        mTestText = (TextView) findViewById(R.id.textView1);
        mTitleText = (TextView) findViewById(R.id.title_textView);
        // 初期ファイル名
        mTitleText.setText("New Text");
        mUndoButton.setOnClickListener(new Button.OnClickListener() {
            @Override
            public void onClick(View v) {
                onUndoButton();
            }
        });
        mRedoButton.setOnClickListener(new Button.OnClickListener() {
            @Override
            public void onClick(View v) {
                onRedoButton();
            }
        });
//        mEndButton.setOnClickListener(new Button.OnClickListener() {
//            @Override
//            public void onClick(View v) {
//                Memo_Apl.this.finish();
//            }
//        });
//
//        mSaveButton.setOnClickListener(new Button.OnClickListener() {
//            @Override
//            public void onClick(View v) {
////                writeFile();
//            }
//        });
//        mOpenButton.setOnClickListener(new Button.OnClickListener() {
//            @Override
//            public void onClick(View v) {
////                readFile();
//            }
//        });
    }

    /**
     * リストの初期化処理
     */
    private void iniList() {
        StationList iniList = new StationList();
        iniList.insert("", 0);
        list = iniList;
        mMemoEdit.setText("");
        // 初期ファイル名
        mTitleText.setText("New Text");
    }

    private TextWatcher   watchHandler = new TextWatcher() {
                                           @Override
                                           public void afterTextChanged(
                                                   Editable s) {
                                               Log.d("DBG_TAG",
                                                       "afterTextChanged=" + s);
//                                               afterStr = s.toString();

                                               if (flgAfter == 0) {
                                                   afterStr1 = s.toString();
                                                   Log.d("DBGD", "afterStr1 = "
                                                           + afterStr1);// 未入力文字列
                                                   flgDest = 1;
                                               } else if (flgAfter == 1) {
                                                   afterStr2 = s.toString();

                                                   Log.d("DBGD", "afterStr2 = "
                                                           + afterStr2);// 未入力文字列

//
//                                                   if(!afterStr1.toString().equals("")&&!afterStr2.toString().equals("")
//                                                           &&!destStr1.toString().equals("")&&!destStr2.toString().equals("")){

                                                   if (afterStr1.toString()
                                                           .equals(afterStr2
                                                                   .toString())
                                                           && destStr1
                                                                   .toString()
                                                                   .equals(destStr2
                                                                           .toString())
                                                           && afterStr1
                                                                   .toString()
                                                                   .equals(destStr1
                                                                           .toString())) {
                                                       insertNode(afterStr2, 1);
                                                       flgNow = 1;
                                                   }
                                                   afterStr1 = afterStr2;
                                                   destStr1 = destStr2;
                                               }
                                           }

                                           @Override
                                           public void beforeTextChanged(
                                                   CharSequence s, int start,
                                                   int count, int after) {
                                               Log.d("DBG_TAG",
                                                       "++++++++++++++++++++++++++++++");// 確定文字列
                                               Log.d("DBG_TAG",
                                                       "beforeTextChanged=" + s);
//s                                               strbase=s.toString();
                                               beforeStr = s.toString();
                                           }

                                           @Override
                                           public void onTextChanged(
                                                   CharSequence s, int start,
                                                   int before, int count) {
                                               Log.d("DBG_TAG",
                                                       "onTextChanged=" + s);
                                               changeStr = s.toString();
                                          }
                                       };
    private InputFilter[] filters      = { new MyFilter() };

    class MyFilter implements InputFilter {
        public CharSequence filter(CharSequence source, int start, int end,
                Spanned dest, int dstart, int dend) {

            Log.d("DBG_TAG", "##############################");// 確定文字列
            Log.d("DBG_TAG", "****1 source  = " + source);// 確定文字列
            Log.d("DBG_TAG", "****2 start   = " + start);// 確定文字列
            Log.d("DBG_TAG", "****3 end     = " + end);// 未入力文字列
            Log.d("DBG_TAG", "****4 dest    = " + dest);// 未入力文字列
            Log.d("DBG_TAG", "****5 dstart  = " + dstart);// 未入力文字列
            Log.d("DBG_TAG", "****6 dend    = " + dend);// 未入力文字列

            if (flgDest == 0) {
                destStr1 = dest.toString();
                flgAfter = 0;
                Log.d("DBGD", "destStr1 = " + destStr1);// 未入力文字列
            } else if (flgDest == 1) {
                destStr2 = dest.toString();
                flgAfter = 1;
                Log.d("DBGD", "destStr1 = " + destStr2);// 未入力文字列
            }
//            else  if(flgDest==1&&flgAfter==1){
//
//            }
            return source;
        }
    }

//    @Override
//    public boolean dispatchKeyEvent(KeyEvent e) {
//        // キーコード表示
//        mTestText2.setText("KeyCode:" + e.getKeyCode());
//        mTestText.setText(mMemoEdit.getText().toString());
//        if (66 == e.getKeyCode()) {
//            insertNode(mMemoEdit.getText().toString(), 1);
//            flg1 = 0;
//            mTestText.setText("12344   " + mMemoEdit.getText().toString());
//        }
//        if (67 == e.getKeyCode()) {
//            flg1 = 1;
//        }
//
//        return super.dispatchKeyEvent(e);
//    }
//
//    private void visibleMenu() {
//        // TODO 自動生成されたメソッド・スタブ
//        if (mVisibleFlg == true) {
//            mLayoutMenu.setVisibility(View.VISIBLE);
//            mVisibleFlg = false;
//        } else {
//            mLayoutMenu.setVisibility(View.GONE);
//            mVisibleFlg = true;
//        }
//    }

    /**
     * Undoボタン押下時
     */
    private void onUndoButton() {
        onLinkUndo();

        // getCursorPoint();
    }

    /**
     * Redoボタン押下時
     */
    private void onRedoButton() {
//        insertNode(mMemoEdit.getText().toString());
        onRedo();
        // getCursorPoint();
    }

    private void getCursorPoint() {
        // TODO 自動生成されたメソッド・スタブ
        int i = 0;
        int j = 0;
        j = mMemoEdit.getSelectionStart();
        i = mMemoEdit.getSelectionEnd();
        Log.d("DBG_TAG", "getSelectionStart=" + j);
        Log.d("DBG_TAG", "getSelectionEnd=" + i);

        SpannableString spannableString = new SpannableString("UNDERLINED");
        spannableString.setSpan(new UnderlineSpan(), 0,
                spannableString.length(), 0);
        mMemoEdit.setText(spannableString);
    }


    private void writeFile(String fileName, String sdDirectory) {
        String filePath = Environment.getExternalStorageDirectory() + "/"
                + sdDirectory + "/" + fileName + ".txt";

        File file = new File(filePath);
        file.getParentFile().mkdir();
        FileOutputStream fos;

        try {
            fos = new FileOutputStream(file);
            OutputStreamWriter osw = new OutputStreamWriter(fos, "UTF-8");
            BufferedWriter bw = new BufferedWriter(osw);

            String str = mMemoEdit.getText().toString();

            bw.write(str);
            bw.flush();
            bw.close();
        } catch (Exception e) {
        }
    }

    private void readFile(String fileName, String sdDirectory) {
        String filePath = Environment.getExternalStorageDirectory() + "/"
                + sdDirectory + "/" + fileName + ".txt";
        File file = new File(filePath);
        try {
            InputStream fis = new FileInputStream(file);
            byte[] readBytes = new byte[fis.available()];
            fis.read(readBytes);
            fis.close();
            mMemoEdit.setText(new String(readBytes));
            // fis.close();
        } catch (Exception e) {
        }
    }
    /**
     * オプションメニューが最初に呼び出される時に1度だけ呼び出されます
     */
    public boolean onCreateOptionsMenu(Menu menu) {
//        MenuInflater inflater = getMenuInflater();
//        inflater.inflate(R.menu.menu, menu);
        boolean rslt = super.onCreateOptionsMenu(menu);
        menu.add(0, MENU_ID_MENU1, Menu.NONE, "新規作成");
        menu.add(0, MENU_ID_MENU2, Menu.NONE, "読み込み");
        menu.add(0, MENU_ID_MENU3, Menu.NONE, "名前を付けて保存");
        menu.add(0, MENU_ID_MENU4, Menu.NONE, "上書保存");
        return rslt;
    }

    /**
     *  オプションメニューアイテムが選択された時に呼び出されます
     */
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        boolean ret = true;
        switch (item.getItemId()) {
        default:
            ret = super.onOptionsItemSelected(item);
            break;
        case MENU_ID_MENU1://新規
            newFile();
            ret = true;
            break;
        case MENU_ID_MENU2://読み込み
            //SDカード内を検索し、ファイルの一覧を表示します。
            selectFile(mSdDirectory);
            ret = true;
            break;
        case MENU_ID_MENU3://保存
            //名前を付けて保存
              writeNewName(mSdDirectory);
          ret = true;
            break;
        case MENU_ID_MENU4:
            // 上書保存
            if (!mNewName.equals("")) {
                writeFile("TEXT_TEST", mSdDirectory);
                Toast.makeText(Memo_Apl.this,
                        "ファイル：「" + mNewName + "」を上書き保存しました。", Toast.LENGTH_LONG)
                        .show();
            } else {
                // 名前を付けて保存
                writeNewName(mSdDirectory);
            }
            ret = true;
            break;

        }
        return ret;
    }

    private void newFile() {
        // TODO 自動生成されたメソッド・スタブ
        //現在のファイルは保存しますか？
        //iie=>終了
        // いぇす→保存メソッドの呼び出し
        // クリーン初期化
//        MessageDialog    mMsgDialog           = new MessageDialog();
        mNewName="";
        MessageDialog    mMsgDialog           = new MessageDialog();
        mMsgDialog.showMsgDialog(this, "保存の確認", "現在のファイルを破棄して新規作成しますか？",
                new OnClickListener[] { onYesClickListener,
                onNoClickListener },onCancelClickListener);
//        iniList();
    }
    /**
     * OKボタンクリック時
     */
    private OnClickListener onYesClickListener   = new OnClickListener() {
                                                    @Override
                                                    public void onClick(
                                                            DialogInterface dialog,
                                                            int which) {
                                                        // Intent intent = new
                                                        // Intent(SelectQuesActivity.this,
                                                        // SelectQuesActivity.class);
                                                        // startActivityForResult(intent,
                                                        // SLT_CONQUE_ACTIVITY2);
                                                        // SelectQuesActivity.this.finish();

                                                        iniList();
                                                        return;
                                                    }
                                                };

    /**
     * Noボタンクリック時
     */
    private OnClickListener onNoClickListener = new OnClickListener() {
                                                    @Override
                                                    public void onClick(
                                                            DialogInterface dialog,
                                                            int which) {

                                                        return;
                                                    }
                                                };
    /**
     * キャンセルボタンクリック時
     */
    private OnCancelListener onCancelClickListener = new OnCancelListener() {
                                                       @Override
                                                       public void onCancel(DialogInterface dialog) {

                                                       }
                                                   };
    private void selectFile(String sdDirectory) {
        // TODO 自動生成されたメソッド・スタブ
        //ファイルの一覧を検索するディレクトリパスを指定する
        String path = Environment.getExternalStorageDirectory().getAbsolutePath() + "/" + sdDirectory;
        Log.e("aaaaa", "path" + path);
        //選択ボックスで表示するファイル名のリストを作成
        File dir = new File(path);
        final File[] files = dir.listFiles();
        final String[] str_items;
        str_items = new String[files.length + 2];
        str_items[0] = "[新規作成]";
        for (int i = 0; i < files.length; i++) {
            File file = files[i];
            str_items[i+1] = file.getName();
        }
        str_items[files.length+1] = "キャンセル";

        //ファイルの選択ボックスを表示
        new AlertDialog.Builder(this)
        .setTitle("ファイルを選択")
        .setItems(str_items, new DialogInterface.OnClickListener(){
            public void onClick(DialogInterface dialog, int which) {

                if(which == 0){
                    newFile();
                } else if (which < files.length){
                    File filePath = files[which];

                    Toast.makeText(Memo_Apl.this,
                        "ファイル：「" + str_items[which].toString() + "」を選択しました。",
                        Toast.LENGTH_LONG).show();

                    try {
                        InputStream fis = new FileInputStream(filePath);
                        byte[] readBytes = new byte[fis.available()];
                        fis.read(readBytes);
                        fis.close();
                        mMemoEdit.setText(new String(readBytes));
                        //ファイル名表示
                        mTitleText.setText(str_items[which].toString());
                        // fis.close();
                    } catch (Exception e) {
                    }
                }
            }
        }
        )
        .show();

        // リストの初期化
        StationList iniList = new StationList();
        iniList.insert("", 0);
        list = iniList;

//            String filePath = Environment.getExternalStorageDirectory() + "/"
//                    + sdDirectory + "/" + fileName + ".txt";
//            File file = new File(filePath);
//            try {
//                InputStream fis = new FileInputStream(file);
//                byte[] readBytes = new byte[fis.available()];
//                fis.read(readBytes);
//                fis.close();
//                mMemoEdit.setText(new String(readBytes));
//                // fis.close();
//            } catch (Exception e) {
//            }

    }


//    private void selectFile() {
//        // TODO 自動生成されたメソッド・スタブ
//        //ファイルの一覧を検索するディレクトリパスを指定する
//        String path = Environment.getExternalStorageDirectory().getAbsolutePath() + "/" + "download";
//        Log.e("aaaaa", "path" + path);
//        //選択ボックスで表示するファイル名のリストを作成
//        File dir = new File(path);
//        final File[] files = dir.listFiles();
//        final String[] str_items;
//        str_items = new String[files.length + 1];
//        for (int i = 0; i < files.length; i++) {
//            File file = files[i];
//            str_items[i] = file.getName();
//        }
//        str_items[files.length] = "キャンセル";
//
//        //ファイルの選択ボックスを表示
//        new AlertDialog.Builder(this)
//        .setTitle("ファイルを選択")
//        .setItems(str_items, new DialogInterface.OnClickListener(){
//            public void onClick(DialogInterface dialog, int which) {
//
//                if (which < files.length){
//                    File filePath = files[which];
//
//                    Toast.makeText(Memo_Apl.this,
//                        "ファイルパス：「" + filePath + "」を選択しました。",
//                        Toast.LENGTH_LONG).show();
//
//
//                }
//            }
//        }
//        )
//        .show();
//    }
    /**
     * オプションメニューが表示される度に呼び出されます
     */
//    @Override
//    public boolean onPrepareOptionsMenu(Menu menu) {
//        menu.findItem(MENU_ID_MENU2).setVisible(visible);
//        visible = !visible;
//        return super.onPrepareOptionsMenu(menu);
//    }

    // ////////////////////////////////////////////連結うんど
    public void insertNode(String str, int index) {

        // if (str == null){
        // str = mMemoEdit.getText().toString();
        // }
        Log.e("DBG_TAG", "insertNode" + str);
        // NodeList node = new NodeList();
        list.insert(str, index); // ノードの追加格納
    }

    public void onLinkUndo() {
        // NodeList node = new NodeList();
        // String str = node.prevNode();
        // String str = node.nextNode();
        if (flgNow == 1) {
            insertNode(mMemoEdit.getText().toString(), 1);
            flgNow = 0;
        }
//        list.previous();
        list.AAprevious();
//        mTestText.setText(str);// １つ前のノードを表示

    }

    public void onRedo() {
        // NodeList node = new NodeList();
        // String str = node.prevNode();
        // String str = node.nextNode();
        if (flgNow == 1) {
            insertNode(mMemoEdit.getText().toString(), 1);
            flgNow = 0;
        }

//        list.next();
        list.AAnext();
//        mTestText.setText(str);// １つ前のノードを表示

    }

    @Override
    public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
        // TODO 自動生成されたメソッド・スタブ
//        mTestText.setText(mMemoEdit.getText());
        return true;
    }


    /**
     * リストを構成するセルとしてのクラス
     */
    class Station {
        private String    sname;  // 持ちデータ
        private int       indexno; // 持ちデータ
        protected Station next;   // 次のセルへの参照

        protected Station prev;   // 前のセルへの参照

        // コンストラクタ：セルのフィールドにデータをセット
        Station(String sname, int indexno) {
            this.sname = sname;
            this.indexno = indexno;
        }

//        // コンストラクタ：セルのフィールドにデータをセット
//        Station(int indexno) {
//            this.indexno = indexno;
//        }
        String getSname() {
            return this.sname;
        }

        int getIndex() {
            return this.indexno;
        }

        /*
         * データの表示用
         */
        void displayName(String str) {
//            System.out.println(getSname() + " ");
//            mTestText.setText(str);
            mMemoEdit.setText(str);
            Log.d("DBG_TAG", "===============" + str);// 未入力文字列
        }
    }

    /**
     * Cellクラスのオブジェクトをリストにしてスタックを実現するクラス
     *
     */
    class StationList {
        Station head, tail, current; // リストの先頭と末尾への参照

        // コンストラクタ
        StationList() {
            head = null;
            tail = null;
        }

        /*
         * @param sname リストの末尾にデータをセットする
         */
        void insert(String sname, int indexno) {
            Station tmp = new Station(sname, indexno);

//            if (head == null) {
//
//                head = tmp;
//                tail = head;
//                head.indexno = 2;// ノードの最後を2にする
//                tail.indexno = 0;
//                Log.d("DBDB", "insert null" + head.indexno);// 未入力文字列
//            } else {
//// 初期のinsert処理
//                // ここで双方向リンクする
////                tail = head;//
//                tail.next = tmp;
//                tmp.prev = tail;
//
//                // 新しいセルを末尾にする
//                tail = tail.next;
//
//                head = tmp;
//                Log.d("ASD", "tail " + tail.indexno+ " = " + tail.sname);// 未入力文字列
//                Log.d("ASD", "head " + head.indexno+ " = " + head.sname);// 未入力文字列
//            }


            if (head == null) {

                head = tmp;
                tail = head;

                head.indexno = 2;// ノードの最後を2にする
                tail.indexno = 0;
                Log.d("DBDB", "insert null" + head.indexno);// 未入力文字列
            } else {
// 初期のinsert処理
                // ここで双方向リンクする
//                tail = head;//
                head.next = tmp;
                tmp.prev = head;

                // 新しいセルを末尾にする
                head = head.next;
                if (flgNow == 1) {
                    head.indexno = 2;// ノードの最後を2にする
                }

//                tail = tmp;
                Log.d("ASD", "tail " + tail.indexno+ " = " + tail.sname);// 未入力文字列
                Log.d("ASD", "head " + head.indexno+ " = " + head.sname);// 未入力文字列
            }

        }

        /**
         * 正規使用する
         * テスト表示用
         * 次のデータを一件で表示する
         **/
        public void AAnext() {
            if ((head.next != null)) // until end of list,
            {
                Log.d("DBB", " START head" + String.valueOf(head.indexno)
                        + " = " + head.sname);// 未入力文字列
                Log.d("DBB", " START tail" + String.valueOf(tail.indexno)
                        + " = " + tail.sname);// 未入力文字列

                Log.d("DBB", " START head.next" + String.valueOf(head.next.indexno)
                        + " = " + head.next.sname);// 未入力文字列
                head = head.next;
                head.displayName(head.sname); // print data
            } else {
                Log.d("DBB", " head " + String.valueOf(head.indexno) + " = "
                        + head.sname);// 未入力文字列
                Log.d("DBB", " tail" + String.valueOf(tail.indexno) + " = "
                        + tail.sname);// 未入力文字列
//                Station tmp = head;
//
//                head = tmp;


//                if ((head.indexno != 2)||(head.indexno == 0)) {
                if (head.indexno != 0) {
                    head.displayName(head.sname); // print data
                    Log.d("DBB", " )))))) head ((((((" + String.valueOf(head.indexno) + " = "
                            + head.sname);// 未入力文字列
                }
            }

        }

        /**
         * 正規使用する
         * テスト表示用
         * 前方のデータを一件で表示する
         */
        public void AAprevious() {
            if (head.prev!=null&&head.indexno == 2) {
                head = head.prev;
            }
            if (head.prev != null) // until end of list,
            {
                Log.d("DBA", " START head" + String.valueOf(head.indexno)
                        + " = " + head.sname);// 未入力文字列
                Log.d("DBA", " START tail" + String.valueOf(tail.indexno)
                        + " = " + tail.sname);// 未入力文字列
                head = head.prev;
                head.displayName(head.sname); // print data

            } else {

                Log.d("DBA", " head " + String.valueOf(head.indexno) + " = "
                        + head.sname);// 未入力文字列
                Log.d("DBA", " tail" + String.valueOf(tail.indexno) + " = "
                        + tail.sname);// 未入力文字列
//                Station tmp = head;
//                head = tmp;
                if (head.indexno != 0) {
                    head.displayName(head.sname); // print data
                }

            }

        }

    }

    /**
     *
     */
    public int writeNewName(String sdDirectory) {
//        int ret;
        mEditText = new EditText(mContext);
        mEditText.setInputType(InputType.TYPE_CLASS_TEXT);
        mFileCheckflg = 3;//未入力
        // タイトル設定
        String title = "名前を付けて保存";
        // メッセージ設定
        String msg = "ファイル名を入力してください";
 //       while (mFileCheckflg!=0) {
            MessageDialog    mMsgDialog           = new MessageDialog();
            mMsgDialog.editDialog(Memo_Apl.this, msg,title, mEditText, new OnClickListener[] { onNewNameClickListener,
                    onNoClickListener }, onCancelClickListener);
//            if (mRepeatEditText.getText().toString()
//                    .equals(wordList[index].english_cd)) {
//                mRepeatCount++;
//                Log.d("DEBaaaG", "OK");
//            }

//            if(mFileCheckflg==0){
//              //重複無し
//                writeFile(mNewName,mSdDirectory);
//                Toast.makeText(Memo_Apl.this,
//                        "ファイル：「" + mNewName + "」を保存しました。",
//                        Toast.LENGTH_LONG).show();
//     //           break;
//            }else if(mFileCheckflg==1){
//                //重複あり
//                // タイトル設定
//                title = "名前を付けて保存";
//                // メッセージ設定
//                msg = "ファイル名が重複しています。上書きしますか？";
//
//            }else{
//                //重複あり
//                // タイトル設定
//                title = "名前を付けて保存";
//                // メッセージ設定
//                msg = "ファイル名が未入力です。入力してください。";
//
//            }

            return mFileCheckflg;
    }

    /**
     * 新規保存ボタンクリック時
     */
    private OnClickListener onNewNameClickListener = new OnClickListener() {
        @Override
        public void onClick( DialogInterface dialog, int which) {
            mNewName =mEditText.getText().toString();

            mFileCheckflg = nameCheck(mSdDirectory,mNewName);
            Log.d("ABCD","SdName   = " +mFileCheckflg );
            againEditDialog(mFileCheckflg);

            return;
        }
    };


    /**
     * 重複しても上書き
     */
    private OnClickListener onNewNameClickListener2 = new OnClickListener() {
        @Override
        public void onClick( DialogInterface dialog, int which) {
//            mNewName =mEditText.getText().toString();
            mFileCheckflg=0;
            writeFile(mNewName, mSdDirectory);

            Toast.makeText(Memo_Apl.this,
                    "ファイル：「" + mNewName + "」を保存しました。", Toast.LENGTH_LONG)
                    .show();

            return;
        }
    };
    /**
     * もう一度表示
     *
     **/
    public void againEditDialog(int FileCheckflg) {
        mEditText = new EditText(mContext);
        mEditText.setInputType(InputType.TYPE_CLASS_TEXT);


//        // タイトル設定
//        String title = "名前を付けて保存";
//        // メッセージ設定
//        String msg = "ファイル名を入力してください";




            if (FileCheckflg == 0) {
                // 重複無し
                writeFile(mNewName, mSdDirectory);
                Toast.makeText(Memo_Apl.this,
                        "ファイル：「" + mNewName + ".txt」を保存しました。", Toast.LENGTH_LONG)
                        .show();
                //ファイル名表示
                mTitleText.setText(mNewName);
            } else if (FileCheckflg == 1) {
                // 重複あり
                // タイトル設定
                String title = "名前を付けて保存";
                // メッセージ設定
                String  msg = "ファイル名が重複しています。上書きしますか？";

                mEditText.setText(mNewName);

                MessageDialog mMsgDialog = new MessageDialog();
                mMsgDialog.editDialog(Memo_Apl.this, msg, title, mEditText,
                        new OnClickListener[] { onNewNameClickListener2,
                        onNoClickListener }, onCancelClickListener);
            } else {
                // 未入力
                // タイトル設定
                String title = "名前を付けて保存";
                // メッセージ設定
                String msg = "ファイル名が未入力です。";
                MessageDialog mMsgDialog = new MessageDialog();
                mMsgDialog.editDialog(Memo_Apl.this, msg, title, mEditText,
                        new OnClickListener[] { onNewNameClickListener,
                        onNoClickListener }, onCancelClickListener);

            }


    }

   /**
    * 重複チェック
    *
    * 戻り値　0が重複無し、1が重複あり、2が名前が無い。
    */
    public int nameCheck(String sdDirectory, String fileName) {

        int ret = 2;//初期値は名無し

        if (!fileName.equals("")) {
            fileName=fileName+".txt";
            String path = Environment.getExternalStorageDirectory()
                    .getAbsolutePath() + "/" + sdDirectory;

            // 選択ボックスで表示するファイル名のリストを作成
            File dir = new File(path);
            final File[] files = dir.listFiles();
            final String[] str_items;

            str_items = new String[files.length + 1];

            ret = 0;//正常
            Log.d("ABCD","fileName = " +fileName );
            for (int i = 0; i < files.length; i++) {
                File file = files[i];
                str_items[i] = file.getName();
                Log.d("ABCD","SdName   = " +str_items[i] );

                if (fileName.equals(str_items[i])) {
                    // 重複している
                    ret = 1;
                }
            }
        }
        return ret;

   }


}